package info.grid.despierto.group;

import info.grid.despierto.R;
import info.grid.despierto.alarm.AlarmListActivity;
import info.grid.despierto.db.GroupTable;
import info.grid.despierto.db.GroupTableDao;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class GroupListActivity extends Activity implements OnItemClickListener,OnItemLongClickListener {

	private static List<GroupRow> groups;
	private ListView list;
	private GroupAdapter adapter;

	private SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy'/'MM'/'dd");

	public GroupTableDao gtdao = new GroupTableDao(this);		//GroupTableDao

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//画面レイアウト
		setContentView(R.layout.group_list);
		loadList(0);
	}

	/**
	 * グループリストロード
	 */
	public void loadList(int position){

		//List生成
		groups = new ArrayList<GroupRow>();
		//GroupTableから一覧取得
		List<GroupTable> gtList = gtdao.list();
		//取得したGroupをListに登録

		for(int i=0;i < gtList.size();i++){
			groups.add(new GroupRow(gtList.get(i).getGroupName(),
					gtList.get(i).getGroupOnoffView(),
					gtList.get(i).isRepeatEveryday(),
					gtList.get(i).isRepeatSun(),
					gtList.get(i).isRepeatMon(),
					gtList.get(i).isRepeatTue(),
					gtList.get(i).isRepeatWed(),
					gtList.get(i).isRepeatThu(),
					gtList.get(i).isRepeatFri(),
					gtList.get(i).isRepeatSat(),
					gtList.get(i).getRowid()));
		}
		list = (ListView) findViewById(R.id.list);
		//一行ごとのレイアウトでGroupのadapterを生成
		adapter = new GroupAdapter(this, R.layout.list_row, groups);
		//adaprerセット
		list.setAdapter(adapter);
		//項目クリックのリスナーをセット
		list.setOnItemClickListener(this);
		//項目長押しのリスナーをセット
		list.setOnItemLongClickListener(this);
		//読み直し後の表示位置を設定
		list.setSelection(position);
	}

	/**
	 * リスト項目長押し
	 */
	@Override
	public boolean onItemLongClick(AdapterView<?> parent, View view, int pos, long id) {
		//編集ダイアログ表示
		listEditShowDialog(this, pos, id);
    	return true;
	}

	/**
	 * リスト項目クリック
	 */
	@Override
	public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
		android.util.Log.v("despierto", R.id.list + "");
		android.util.Log.v("despierto", R.id.titleText + "");
		GroupRow group = adapter.getItem(pos);
		switch (view.getId()) {

		//CheckBoxをクリックしたとき
		case R.id.group_onoff:
			GroupTable gt = new GroupTable();
			gt = gtdao.load(group.getGroup_id());
			if(gt.getGroupOnoff() == 0){
				gt.setGroupOnoff(1);
				Toast.makeText(this, group.getName()+"Set", Toast.LENGTH_SHORT).show();
			}else{
				gt.setGroupOnoff(0);
				Toast.makeText(this, group.getName()+"UnSet", Toast.LENGTH_SHORT).show();
			}
			gtdao.save(gt);
			break;

		//リストを選択した時
		case -1:
			Intent intent = new Intent(this, AlarmListActivity.class);
			intent.putExtra("TITLE", groups.get(pos).getName());
			intent.putExtra("GROUP_ID", groups.get(pos).getGroup_id());
			startActivity(intent);
			break;

		}
	}

	/**
	 * MENUボタンを押したときの処理
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.layout.group_list_menu, menu);
		return true;
	}

	/**
	 * MENUの項目を押したときの処理
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
			/** 新規登録 **/
			case R.id.new_regist:
				//ダイアログ表示
				newResultShowDialog(this);
				break;

			/** 終了 **/
			case R.id.app_finish:
				finish();	// アプリケーション終了
				break;

		}
		return super.onOptionsItemSelected(item);
	}

	/**
	 * Group新規登録ダイアログ
	 * @param context
	 */
    private void newResultShowDialog(Context context) {
    	//インフレータ生成
    	LayoutInflater inflater = LayoutInflater.from(this);
       	//ダイアログのビューにnew_result_dialog.xmlを指定する
    	View dialogView = inflater.inflate(R.layout.group_new_dialog, (ViewGroup) findViewById(R.id.group_new_dialog_layout_root));

    	//テキストエリアIDの設定
       	final EditText newGroupNameEdit = (EditText)dialogView.findViewById(R.id.group_new_text);

       	//ビルダーの生成
       	AlertDialog.Builder builder = new AlertDialog.Builder(context);
       	builder
       		//ビューセット
       		.setView(dialogView)
       		//タイトルセット
       		.setTitle(R.string._new_regist)
       		//アイコンセット
       		.setIcon(android.R.drawable.ic_menu_add)
       		// Positiveボタン、リスナを設定(登録ボタン)
			.setPositiveButton(R.string._save, new DialogInterface.OnClickListener() {
				//ボタンクリック時の動作
				public void onClick(DialogInterface dialog, int whichButton) {
					//日付の取得
					Date date1 = new Date();  //Dateオブジェクトを生成

					//テキスト入力がなかった場合
					String newGroupName = getString(R.string._group) +sdf1.format(date1);

					if(newGroupNameEdit.getText().toString() != null && !newGroupNameEdit.getText().toString().equals("")){
						newGroupName = newGroupNameEdit.getText().toString();
					}

					//新規登録するentity
					GroupTable gt = new GroupTable();
					gt.setGroupName(newGroupName);
					gt.setGroupOnoff(1);
					gt.setRepeatEveryday(1);
					gt.setRepeatSun(0);
					gt.setRepeatMon(0);
					gt.setRepeatThu(0);
					gt.setRepeatWed(0);
					gt.setRepeatThu(0);
					gt.setRepeatFri(0);
					gt.setRepeatSat(0);

					//登録
					gtdao.save(gt);

					//現在の表示位置を取得
					int lastPos  = 0;
					if(list != null){
						lastPos = list.getLastVisiblePosition()+1;
					}
					//リスト更新
					loadList(lastPos);
				}
			})
			// Negativeボタン、リスナを設定(キャンセルボタン)
			.setNegativeButton(R.string._cancel, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int whichButton) {
				}
			})
			.setCancelable(true)
			//表示
       		.show();
    }

    /**
     * Groupリスト編集ダイアログ
     * @param context
     * @param pos
     * @param id
     */
    private void listEditShowDialog(Context context, final int pos, long id) {
    	//インフレータの取得
    	LayoutInflater inflater = LayoutInflater.from(this);
    	//レイアウトxml設定
    	final View dialogView = inflater.inflate(R.layout.group_edit_dialog, null);


    	GroupRow group = adapter.getItem(pos);
    	GroupTable gt = new GroupTable();
		gt = gtdao.load(group.getGroup_id());

    	//グループ名テキストボックス
    	final EditText editGroupNameEdit = (EditText)dialogView.findViewById(R.id.edit_group_name);
    	editGroupNameEdit.setText(group.getName());

    	//各種チェックボックス
    	final CheckBox eveCheckBox = (CheckBox)dialogView.findViewById(R.id.edit_eve_check);
   		eveCheckBox.setChecked(gt.isRepeatEveryday());
   		final CheckBox sunCheckBox = (CheckBox)dialogView.findViewById(R.id.edit_sun_check);
   		sunCheckBox.setChecked(gt.isRepeatSun());
   		final CheckBox monCheckBox = (CheckBox)dialogView.findViewById(R.id.edit_mon_check);
   		monCheckBox.setChecked(gt.isRepeatMon());
   		final CheckBox tueCheckBox = (CheckBox)dialogView.findViewById(R.id.edit_tue_check);
   		tueCheckBox.setChecked(gt.isRepeatTue());
   		final CheckBox wedCheckBox = (CheckBox)dialogView.findViewById(R.id.edit_wed_check);
   		wedCheckBox.setChecked(gt.isRepeatWed());
   		final CheckBox thuCheckBox = (CheckBox)dialogView.findViewById(R.id.edit_thu_check);
   		thuCheckBox.setChecked(gt.isRepeatThu());
   		final CheckBox friCheckBox = (CheckBox)dialogView.findViewById(R.id.edit_fri_check);
   		friCheckBox.setChecked(gt.isRepeatFri());
   		final CheckBox satCheckBox = (CheckBox)dialogView.findViewById(R.id.edit_sat_check);
   		satCheckBox.setChecked(gt.isRepeatSat());

    	//ダイアログビルダー
    	AlertDialog.Builder builder = new AlertDialog.Builder(context);

       	builder
       		.setTitle(groups.get(pos).getName()).setView(dialogView)
       		//Positiveボタン、リスナを設定
       		.setPositiveButton(R.string._save, new DialogInterface.OnClickListener() {
				//ボタンクリック時の動作
				public void onClick(DialogInterface dialog, int whichButton) {
					//日付の取得
					Date date1 = new Date();  //Dateオブジェクトを生成

					//グループ名セット
					//テキスト入力がなかった場合
					String editGroupName = getString(R.string._group) +sdf1.format(date1);
					if(editGroupNameEdit.getText().toString() != null && !editGroupNameEdit.getText().toString().equals("")){
						editGroupName = editGroupNameEdit.getText().toString();
					}
					GroupTable gt = new GroupTable();
					gt = gtdao.load(groups.get(pos).getGroup_id());
					gt.setGroupName(editGroupName);

					//チェックボックスセット
					gt.setRepeatEveryday(eveCheckBox.isChecked());
					gt.setRepeatSun(sunCheckBox.isChecked());
					gt.setRepeatMon(monCheckBox.isChecked());
					gt.setRepeatTue(tueCheckBox.isChecked());
					gt.setRepeatWed(wedCheckBox.isChecked());
					gt.setRepeatThu(thuCheckBox.isChecked());
					gt.setRepeatFri(friCheckBox.isChecked());
					gt.setRepeatSat(satCheckBox.isChecked());
					gtdao.save(gt);

					//現在の表示位置を取得
					int firstPos  = 0;
					if(list != null){
						firstPos = list.getFirstVisiblePosition();
					}
					loadList(firstPos);

				}
			})
			// Neutralボタン、リスナを設定(Cancel)
			.setNeutralButton(R.string._cancel, new DialogInterface.OnClickListener() {
				//ボタンクリック時の動作
				public void onClick(DialogInterface dialog, int whichButton) {
				}
			})
			// Negativeボタン、リスナを設定(Delete)
			.setNegativeButton(R.string._delete, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int whichButton) {
					GroupTable gt = new GroupTable();
					gt = gtdao.load(groups.get(pos).getGroup_id());
					gtdao.delete(gt);

					//現在の表示位置を取得
					int firstPos  = 0;
					if(list != null){
						firstPos = list.getFirstVisiblePosition();
					}
					loadList(firstPos);
				}
			})
			.show();
    }

}